﻿#ifndef __SS_TIMER_H__
#define __SS_TIMER_H__
#include "ssTime.h"

namespace StarSeeker
{
///////////////////////////////////时差计时器//////////////////////////////////
#define SS_DIFF_TIMER_TYPE_SEC		0 //用秒计算(32bit)
#define SS_DIFF_TIMER_TYPE_MS		1 //用毫秒计算(64bit)
#define SS_DIFF_TIMER_TYPE_CLOCK	2 //用clock函数计算(64bit),用毫秒计算时间差,linux的clock不会计入sleep时间
class ssDiffTimer
{
public:
	ssDiffTimer();
	//初始化
	void Init(u8 type=SS_DIFF_TIMER_TYPE_SEC);
	//计算时间
	void UpdateTime();
	//当前时间戳
	const ST64_u& GetCurrent()
	{
		return m_curTime;
	}
	//当前时间戳距离上一帧的差
	const ST64_u& GetDifference()
	{
		return m_difference;
	}
	//累计时间
	const ST64_u& GetTotal()
	{
		return m_totla;
	}
	//累计时间清零
	void ResetTotal();
	//累计时间是否到达
	bool IsAccumulatedTimeUp(u32 interval);
private:
	u8		m_type;			//计时类型
	ST64_u	m_curTime;		//当前时间
	ST64_u	m_lastTime;		//上次时间
	ST64_u	m_difference;	//时间差
	ST64_u	m_totla;		//累计时间
};
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////帧速计时器///////////////////////////////////
class ssFrameTimer
{
public:
	ssFrameTimer();
	void Init(u32 interval, bool isBuiltIn);
	//根据间隔时间自动计算（每帧调用一次）
	bool UpdateAndCompute(u32 ms);
	//只更新统计值（每帧调用一次）
	void Update(u32 ms);
	//计算平均值
	void Compute();
	//u32 GetDifference()
	//{
	//	return m_timer.GetDifference().u32p;
	//}
private:
	ssDiffTimer	m_timer;		//内置计时器
	bool		m_isBuiltIn;	//使用内置计时器
	u64			m_frameCount;	//帧数累计
	u64			m_tickCount;	//时间累计(毫秒)
	u64			m_interval;		//统计间隔(毫秒)
public:
	ST64_u		m_mspf;			//单位：毫秒/帧
	ST64_u		m_fps;			//单位：帧/秒
};
//////////////////////////////////////////////////////////////////////////////
}
#endif
